package cn.edu.ctbu.utils;


import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;

@ServerEndpoint("/WebSocket")       //接口名：chatWebSocket
@Component
@Slf4j
public class WebSocketServer {

    /**
     *  [关于@OnOpen、@OnMessage、@OnClose、@OnError 中 Session session 的用意]
     *
     *  Session session: 主要用于代表一个单独的 WebSocket 连接会话.每当一个 WebSocket 客户端与服务器端点建立连接时，都会创建一个新的 Session 实例
     *      标识连接：每个 Session 对象都有一个唯一的 ID，可以用来识别和跟踪每个单独的连接。   ——>     可以使用 session.getId() 方法来获取这个 ID.对于日志记录、跟踪用户会话等方面非常有用。
     *      管理连接：可以通过 Session 对象来管理对应的 WebSocket 连接，例如发送消息给客户端、关闭连接等    ——>     session.getBasicRemote().sendText(message) 同步地发送文本消息，
     *                                                                                                 或者使用 session.getAsyncRemote().sendText(message) 异步地发送.可以调用 session.close() 来关闭 WebSocket 连接。
     *      获取连接信息：Session 对象提供了方法来获取连接的详细信息，比如连接的 URI、用户属性等。    ——>     可以使用 session.getRequestURI() 获取请求的 URI
     * **/

    private static Session session;

    //建立连接时
    @OnOpen
    public void onOpen(Session session){
        log.info("会话id" + session.getId());
        this.session=session;
        log.info(String.valueOf(this.session));
    }

    //接收客户端消息
    @OnMessage
    public void onMessage(String message,Session session) throws IOException {
        //当从客户端接收到消息时调用
        log.info("会话id：" + session.getId() + ": 的消息" + message);
        session.getBasicRemote().sendText("回应" + "[" + message + "]");
    }

    //链接关闭时
    @OnClose
    public void onClose(Session session){
        log.info("会话id关闭" + session.getId());
    }


    //链接出错时
    @OnError
    public void onError(Session session,Throwable throwable){
        //错误提示
        log.error("出错原因" + throwable.getMessage());
        //抛出异常
        throwable.printStackTrace();
    }

    /**
     * 自定义发送消息
     */
    public void sendMessage(String message) throws IOException {
        log.info(String.valueOf(this.session));
        if (this.session!=null) {
            this.session.getBasicRemote().sendText(message);
        }
    }
}
